home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Magazin/MacEasy 14
/
Mac Magazin and MacEasy Magazine CD - Issue 14.iso
/
Wissenschaft & Technik
/
MacGzip 1.0b0
/
Mac
/
FileTypes.c
< prev
next >
Wrap
Text File
|
1995-09-05
|
7KB
|
408 lines
/*
* FileTypes.c
*
* Suffix mappings and file types
* August 15, 1995
* (c)1995 SPDsoft <MacSPD@ivo.cps.unizar.es>
*
* Requires IC ProgKit 1.1
*
*/
#include <ctype.h> /* tolower */
#include "ICAPI.h"
#include "ICKeys.h"
#include "FileTypes.h"
#include "Prefs.h"
#include "GzErrors.h"
#include "GzPStrings.h"
/*
* Globals
*/
static Boolean CheckExtension( Str255 Name, Str255 Extension );
static void CheckFetchPrefs( Str255 pfName, TSufMapPtr SufMapPtr);
/*
* Functions
*/
/******************************************************************************
*
* Fetch prefs stuff
*
*/
#define kFetchPrefsNameStrID 131
#define kFetchPrefsResourceType 'SUFX'
#define kFetchPrefsResourceID 1
/*
* Get Fetch Prefs
*/
Boolean InitFetchMappings( Size *FPrefsSize, Handle *FPrefs )
{
short prefsResRefNum;
Boolean result = TRUE;
if ( *FPrefs != nil )
return result;
if ( -1 != (prefsResRefNum = OpenPrefsResFile(fsRdPerm, false, kFetchPrefsNameStrID)) )
{
if ( nil != (*FPrefs = GetResource('SUFX',1)))
{
DetachResource( *FPrefs );
if ( ResError() == noErr )
{
*FPrefsSize = GetHandleSize(*FPrefs);
result = ( MemError() != noErr );
}
}
CloseResFile(prefsResRefNum);
}
if ( result )
{
*FPrefsSize = 0;
if(*FPrefs != nil)
{
DisposeHandle(*FPrefs);
*FPrefs = nil;
}
}
return result;
}
void DisposeFetchMappings( Size *FPrefsSize, Handle *FPrefs )
{
*FPrefsSize = 0;
if(*FPrefs != nil)
{
DisposeHandle(*FPrefs);
*FPrefs = nil;
}
}
/******************************************************************************
*
* Internet Config stuff
*
* Get Internet Config Prefs
*/
Boolean InitICMappings( ICInstance *inst, Handle *ICmappings )
{
Boolean ICErr = true;
if ( *ICmappings != nil )
return ICErr;
if (!ICStart(inst, 'GZIP'))
{ // init the sucker
if (!ICFindConfigFile(*inst, 0, nil))
{ // locate the config file
if (!ICBegin(*inst, icReadOnlyPerm))
{ // open up the file for reading
ICAttr attr = 0;
ICErr = false;
if (!ICGetPrefHandle(*inst, (ConstStr255Param)kICMapping, &attr, ICmappings))
{
HUnlock(*ICmappings);
}
else
{
/* Can't get ICmappings */
ICErr = true;
}
ICEnd(*inst); // all done
}
}
}
if((ICErr)&&(*ICmappings != nil))
{
DisposeHandle(*ICmappings);
*ICmappings = nil;
ICStop(*inst);
}
return ICErr;
}
void DisposeICMappings( ICInstance *inst, Handle *ICmappings )
{
if(*ICmappings != nil)
{
DisposeHandle(*ICmappings);
*ICmappings = nil;
ICStop(*inst);
}
}
/******************************************************************************
*
* Generic functions
*/
/*
* fName is a C string.
*/
/*
* IC Matching:
*
* 1. type, creator and extension match 11
* 2. type and extension match 10
* 3. extension and creator match 7
* 4. extension matches 6
* 5. type and creator match 5
* 6. type matches 4
* 7. anything else
*
* T=4, C=1, E=6
*/
#define kICTypeMatch 4
#define kICCreatorMatch 1
#define kICExtensionMatch 6
OSErr ResolveFileType( FSSpec *fSpec, char *fName, TSufMapPtr SufMapPtr, short Select )
{
FInfo vFInfo;
Str255 pfName;
OSErr oserr;
long pos = 0;
ICMapEntry entry;
int MatchingRank,
BestMatchingRank = 0;
if (Select & kRFTFromName ) /* from fName */
{
CStrToStr255( pfName, fName );
}
else /* from fSpec */
{
PStrCpy( pfName, fSpec->name);
}
SufMapPtr->Found = FALSE;
if (Select & kRFTUpload ) /* Mac -> Net */
{
if (Select & kRFTFromName )
oserr = GetFInfo(pfName,0,&vFInfo);
else
oserr = FSpGetFInfo(fSpec,&vFInfo);
if ( oserr != noErr)
return oserr;
SufMapPtr->Type = vFInfo.fdType;
SufMapPtr->Creator = vFInfo.fdCreator;
switch ( Select & 0x00FF )
{
case kRFTIC:
while ( noErr == ( oserr = (OSErr)ICGetMapEntry(SufMapPtr->ICinst, SufMapPtr->ICmappings, pos, &entry)))
{
pos += entry.total_length;
MatchingRank = 0;
if (!(entry.flags & ICmap_not_outgoing_mask))
{
if( vFInfo.fdType == entry.file_type )
MatchingRank += kICTypeMatch;
if( vFInfo.fdCreator == entry.file_creator)
MatchingRank += kICCreatorMatch;
if (CheckExtension( pfName, entry.extension ))
MatchingRank += kICExtensionMatch;
if ( MatchingRank > BestMatchingRank )
{
BestMatchingRank = MatchingRank;
/*
* copy info
*/
SufMapPtr->Binary = (entry.flags & ICmap_binary_mask);
SufMapPtr->MacFile = (entry.flags & ICmap_resource_fork_mask);
SufMapPtr->Found = TRUE;
#ifdef EXTENSION_REQUIRED
PStrCpy(SufMapPtr->Suffix, entry.extension);
#endif
}
}
}/* while */
break;
case kRFTFetch:
CheckFetchPrefs( pfName, SufMapPtr);
break;
default:
break;
}
}
else /* Net -> Mac */
{
switch ( Select & 0x00FF )
{
case kRFTIC:
while ( noErr == ( oserr = ICGetMapEntry(SufMapPtr->ICinst, SufMapPtr->ICmappings, pos, &entry)))
{
pos += entry.total_length;
if (!(entry.flags & ICmap_not_incoming_mask))
{
SufMapPtr->Type = entry.file_type;
SufMapPtr->Creator = entry.file_creator;
SufMapPtr->Binary = (entry.flags & ICmap_binary_mask);
SufMapPtr->MacFile = (entry.flags & ICmap_resource_fork_mask);
if ( CheckExtension( pfName, entry.extension ))
{
SufMapPtr->Found = true;
break;
}
}
}
break;
case kRFTFetch:
CheckFetchPrefs( pfName, SufMapPtr);
break;
default:
break;
}
}
return oserr;
}
/******************************************************************************
*
* Local functions
*/
static Boolean CheckExtension( Str255 Name, Str255 Extension )
{
/*
* test name vs extension
*/
Boolean result = FALSE;
register char *n, *e;
long elen, nlen;
if ( ( 0 != (elen = (long) Extension[0])) &&
( 0 != (nlen = (long) Name[0])) )
{
n = (char *)( &Name[0] + (Size) nlen );
e = (char *)( &Extension[0] + (Size) elen );
while (
(tolower(*n) == tolower(*e)) &&
( e > (char *)Extension ) &&
( n > (char *)Name )
)
{
e --;
n --;
}
result = ( e == (char *)Extension );
}
return result;
}
static void CheckFetchPrefs( Str255 pfName, TSufMapPtr SufMapPtr)
{
Ptr pPrefs;
register char *p;
HLock( SufMapPtr->FPrefs );
pPrefs = *(SufMapPtr->FPrefs);
while( pPrefs < (*(SufMapPtr->FPrefs) + SufMapPtr->FPrefsSize ))
{
SufMapPtr->Type = *(OSType *)pPrefs; pPrefs += 4;
SufMapPtr->Creator = *(OSType *)pPrefs; pPrefs += 4;
SufMapPtr->Binary = (*(short *)pPrefs != 0); pPrefs += 2;
SufMapPtr->MacFile = (*(short *)pPrefs != 0); pPrefs += 2;
p = & SufMapPtr->Suffix[1];
SufMapPtr->Suffix[0]=0x00;
while((*p++ = *(char *)(pPrefs++))!=0)
SufMapPtr->Suffix[0]++;
#ifdef GET_DESC
p = SufMapPtr->Description;
while((*p++= *(char *)(pPrefs++))!=0)
;
#else
while(*(char *)(pPrefs++)!=0)
;
#endif
if ( CheckExtension( pfName, * (Str255 *) & SufMapPtr->Suffix ) )
{
SufMapPtr->Found = true;
break;
}
}
HUnlock( SufMapPtr->FPrefs );
}